<?php

class Product_IndexController extends Zend_Controller_Action
{
	protected $_object;

	public function init()
	{
		//tạo đối tượng
		$this->_object = new Admin_Model_Product ();
		
		//lấy tiêu đề 
		$this->_helper->common->setCaptions ();
	}

	//
	public function detailAction()
	{
		//lấy tham số
		$request = $this->_request;
		$id = $request->getParam ( 'id' );
		
		//lấy đối tượng cần cập nhật
		$this->_object->findBase ( $id );
		
		//tạo form
		$form = new Product_Form_Product_Detail ( $this );
		
		//do du lieu vao hop chon thuoc nhom hang hoa nao
		/*$product_group = new Admin_Model_ProductGroup ();
		$options = $product_group->fetchOptions ( $product_group->fetchGroups () );
		$form->product_product_group_code->setMultiOptions ( array ('' => '- Chọn -' ) + $options );*/
		/*
		//do du lieu vào hop chon thuoc nhóm kho nào
		$warehouse_group = new Admin_Model_WarehouseGroup ();
		$warehouse_groups = $warehouse_group->fetchAllBase ( null, "warehouse_group_name ASC" );
		$warehouse_groups = $warehouse_group->toArray2 ( $warehouse_groups, "warehouse_group_code", "warehouse_group_name" );
		$form->product_warehouse_group_code->setMultiOptions ( array ("" => "- Chọn -" ) + $warehouse_groups );
		*/
		/*
		//lay bo don vi tinh
		$unit_change = new Admin_Model_UnitChange ();
		$sql = "SELECT DISTINCT * 
				FROM tbl_unit_change 
				ORDER BY unit_change_code ASC";
		$unit_changes = $unit_change->queryBase ( $sql );
		$unit_changes = $unit_change->toArray2 ( $unit_changes, "unit_change_code", "unit_change_code" );
		$form->product_unit_change_code->setMultiOptions ( array ("" => "- Chọn -" ) + $unit_changes );
		*/
		//đổ dữ liệu vào form 
		$form->populate ( $this->_object->toArray () );
		/*
		if ($form->product_instore_max->getValue () == - 1)
			$form->product_instore_max->setValue ( "Chưa xác định" );
		if ($form->product_instore_min->getValue () == - 1)
			$form->product_instore_min->setValue ( "Chưa xác định" );
		*/
		//truyền dữ liệu ra view
		$this->view->form = $form;
	}

	//xem danh sách tất cả 
	public function indexAction()
	{
		//lấy tham số
		$request = $this->_request;
		$product_status = $request->getParam ( 'product_status', '' );
		$product_code = $request->getParam ( 'product_code', '' );
		$product_name = $request->getParam ( 'product_name', '' );
		$group_keyword = $request->getParam ( 'group_keyword', '' );
		
		//các cột cần lấy dữ liệu
		$select = " 
		SELECT
			`product_id`
			, `product_code`
			, `product_name`
			, `product_product_group_code`
			, `product_warehouse_group_code`
			, `product_instore_max`
			, `product_unit_change_code`
			, `product_instore_min`
			, `product_note`
			, `product_type`
			, `product_order`
			, `product_status`
			, `product_group_name`
			, `warehouse_group_name`
		FROM tbl_product
			LEFT JOIN tbl_product_group ON product_group_code = product_product_group_code
			LEFT JOIN tbl_warehouse_group ON warehouse_group_code = product_warehouse_group_code";
		
		//thiết lập điều kiện lấy dữ liệu
		$where = " WHERE 1 ";
		if ($product_status != '')
			$where .= " AND `product_status` = '$product_status' ";
		if ($product_code != '')
			$where .= " AND `product_code` LIKE '%$product_code%' ";
		if ($product_name != '')
			$where .= " AND `product_name` LIKE '%$product_name%' ";
		
		//thiết lập thứ tự lấy dữ liệu
		switch ($group_keyword)
		{
			case 0 :
				$require_order = array ('product_product_group_code ASC' );
				break;
			case 1 :
				$require_order = array ('product_warehouse_group_code ASC' );
				break;
			case 2 :
				$require_order = array ();
				break;
		}
		$order = $this->_helper->common->getOrderString ( array ('product_order ASC' ), $require_order );
		
		//lấy dữ liệu
		$query = $select . $where . $order;
		$data = $this->_object->queryBase ( $query );
		
		//phân trang
		$this->_helper->common->paginate ( $data );
		
		//truyền dữ liệu ra view
		$this->view->product_status = $product_status;
		$this->view->product_code = $product_code;
		$this->view->product_name = $product_name;
		$this->view->group_keyword = $group_keyword;
	}

	//kích hoạt/ vô hiệu hóa 1 hoặc nhiều dòng
	public function publishAction()
	{
		$this->_helper->action->publish ( $this->_object, 'product_status' );
	}

	//lưu thứ tự sắp xếp của các dòng
	public function saveOrderAction()
	{
		$this->_helper->action->saveOrder ( $this->_object, 'product_order' );
	}

	//xóa 1 hoặc nhiều dòng
	public function deleteAction()
	{
		$this->_helper->action->delete ( $this->_object, 'afterDelete', 'beforeDelete' );
	}

	//hàm kiểm tra dữ liệu ràng buộc trước khi xóa
	//nếu trả về true thì cho xóa, ngược lại kg cho xóa
	public function beforeDelete()
	{
		$request = Zend_Controller_Front::getInstance ()->getRequest ();
		$ids = ( array ) $request->getParam ( 'id' );
		$msg = "";
		foreach ( $ids as $id )
		{
			//lay san pham
			$product = new Admin_Model_Product ();
			$product->findBase ( $id );
			
			//Kiem tra xem san pham co nam trong phieu xuat/nhap kho...
			$inbound_detail = new Admin_Model_InboundDetail ();
			if ($inbound_detail->fetchRowAllBase ( "inbound_detail_product_code = '{$product->product_code}' OR  inbound_detail_sub_product_code = '{$product->product_code}' " ) !== FALSE)
			{
				$msg .= " - Phiếu nhập/xuất kho có mã số: <strong>{$inbound_detail->inbound_detail_inbound_code}</strong>";
				break;
			}
			
			//Kiem tra xem san pham co nam trong suc chua kho tbl_location_contain
			$location_contain = new Admin_Model_LocationContain ();
			if ($location_contain->fetchRowAllBase ( "location_contain_product_code = '{$product->product_code}' " ) !== FALSE)
			{
				$msg .= " - Sức chứa của kho có mã số: <strong>{$location_contain->location_contain_location_code}</strong>";
				break;
			}
		}
		if ($msg != "")
		{
			$msg = "Dữ liệu này đã có trong:<br />" . $msg;
			$this->_helper->flashMessenger ( $msg );
			return false;
		}
		return true;
	}

	//hàm giải phóng dữ liệu liên quan sau khi xóa
	public function afterDelete()
	{
	
	}

	//thêm 1 dòng
	public function insertAction()
	{
		//lấy tham số
		$request = $this->_request;
		
		//tạo form
		$form = new Product_Form_Product_Insert ( $this );
		
		//do du lieu vao hop chon thuoc nhom hang hoa nao
		/*$product_group = new Admin_Model_ProductGroup ();
		$options = $product_group->fetchOptions ( $product_group->fetchGroups () );
		$form->product_product_group_code->setMultiOptions ( array ('' => '- Chọn -' ) + $options );*/
		
		//do du lieu vào hop chon thuoc nhóm kho nào
		/*$warehouse_group = new Admin_Model_WarehouseGroup ();
		$warehouse_groups = $warehouse_group->fetchAllBase ( null, "warehouse_group_name ASC" );
		$warehouse_groups = $warehouse_group->toArray2 ( $warehouse_groups, "warehouse_group_code", "warehouse_group_name" );
		$form->product_warehouse_group_code->setMultiOptions ( array ("" => "- Chọn -" ) + $warehouse_groups );*/
		
		//do du lieu vào hop chon đon vi tính
		/*$unit = new Admin_Model_Unit ();
		$units = $unit->fetchAllBase ( null, "unit_name ASC" );
		$units = $unit->toArray2 ( $units, "unit_code", "unit_name" );
		$form->product_instore_unit_code->setMultiOptions ( array ("" => "- Chọn -" ) + $units );*/
		
		//lay bo don vi tinh
		/*$unit_change = new Admin_Model_UnitChange ();
		$sql = "SELECT DISTINCT * 
				FROM tbl_unit_change 
				ORDER BY unit_change_code ASC";
		$unit_changes = $unit_change->queryBase ( $sql );
		$unit_changes = $unit_change->toArray2 ( $unit_changes, "unit_change_code", "unit_change_code" );
		$form->product_unit_change_code->setMultiOptions ( $unit_changes );*/
		
		//phần xử lí chính
		if ($request->isPost ()) //khi post giá trị
		{
			if ($form->isValid ( $request->getPost () )) //khi giá trị trong form đã được kiểm tra thành công
			{
				$adminAction = $form->getValue ( 'adminAction' );
				$product = new Admin_Model_Product ( $form->getValues () );
				
				//kiểm tra có trùng code không?
				$exist = $this->_object->countBase ( "`product_code`='{$product->product_code}'", 0 ) > 0;
				
				//nếu trùng mã báo lỗi
				if ($exist)
				{
					$form->getElement ( 'product_code' )->addError ( $this->_helper->common->getCaption ( 'product_code' ) . ' đã tồn tại.' );
					$form->markAsError ();
				}
				
				//nếu form không có lỗi
				if (! $form->isErrors ())
				{
					try
					{
						//insert dòng mới
						$product_unit_change_code = $form->getValue ( "product_unit_change_code" );
						$product_unit_change_code = "," . implode ( ",", $product_unit_change_code ) . ",";
						$product->product_unit_change_code = $product_unit_change_code;
						$product->insertBase ();
						
						//cập nhật lại cách qui đổi đơn vị tính
						$this->updateChange($product->product_unit_change_code);

						//thông báo + chuyển hướng trang khi thành công				
						$this->_helper->flashMessenger ( 'Thêm thành công.' );
						if ($adminAction == 'save-and-close')
						{
							$this->_helper->redirector ( 'index', 'index', 'product', array () );
						}
						else if ($adminAction == 'save-and-new')
						{
							$this->_helper->redirector ( 'insert', 'index', 'product', array () );
						}
					}
					catch ( Exception $e )
					{
					
					}
				}
			}
		}
		else //khi vào form lần đầu tiên
		{
		
		}
		
		//truyền dữ liệu ra view
		$this->view->form = $form;
	}

	//cập nhật 1 dòng
	public function updateAction()
	{
		//lấy tham số
		$request = $this->_request;
		$id = $request->getParam ( 'id' );
		if (is_array ( $id ))
			$id = $id [count ( $id ) - 1];
		
		//lấy đối tượng cần cập nhật
		$first_product = new Admin_Model_Product ();
		$first_product->findBase ( $id );
		
		//tạo form
		$form = new Product_Form_Product_Update ( $this );
		
		
		//do du lieu vao hop chon thuoc nhom hang hoa nao
		/*$product_group = new Admin_Model_ProductGroup ();
		$options = $product_group->fetchOptions ( $product_group->fetchGroups () );
		$form->product_product_group_code->setMultiOptions ( array ('' => '- Chọn -' ) + $options );*/
		
		/*
		//do du lieu vào hop chon thuoc nhóm kho nào
		$warehouse_group = new Admin_Model_WarehouseGroup ();
		$warehouse_groups = $warehouse_group->fetchAllBase ( null, "warehouse_group_name ASC" );
		$warehouse_groups = $warehouse_group->toArray2 ( $warehouse_groups, "warehouse_group_code", "warehouse_group_name" );
		$form->product_warehouse_group_code->setMultiOptions ( array ("" => "- Chọn -" ) + $warehouse_groups );
		*/
		/*
		//do du lieu vào hop chon đon vi tính
		$unit = new Admin_Model_Unit ();
		$units = $unit->fetchAllBase ( null, "unit_name ASC" );
		$units = $unit->toArray2 ( $units, "unit_code", "unit_name" );
		$form->product_instore_unit_code->setMultiOptions ( array ("" => "- Chọn -" ) + $units );
		*/
		/*
		//lay bo don vi tinh
		$unit_change = new Admin_Model_UnitChange ();
		$sql = "SELECT DISTINCT * 
				FROM tbl_unit_change 
				ORDER BY unit_change_code ASC";
		$unit_changes = $unit_change->queryBase ( $sql );
		$unit_changes = $unit_change->toArray2 ( $unit_changes, "unit_change_code", "unit_change_code" );
		$form->product_unit_change_code->setMultiOptions (  $unit_changes );
		*/
		//phần xử lí chính
		if ($request->isPost ()) //khi post giá trị
		{
			if ($form->isValid ( $request->getPost () )) //khi giá trị trong form đã được kiểm tra thành công
			{
				$adminAction = $form->getValue ( 'adminAction' );
				$product = new Admin_Model_Product ( $form->getValues () );
				
				//kiểm tra có trùng code không?
				$exist = $this->_object->countBase ( "`product_code`='{$product->product_code}' AND product_id<>$id ", 0 ) > 0;
				
				//nếu trùng mã báo lỗi
				if ($exist)
				{
					$form->getElement ( 'product_code' )->addError ( $this->_helper->common->getCaption ( 'product_code' ) . ' đã tồn tại.' );
					$form->markAsError ();
				}
				
				//nếu form không có lỗi
				if (! $form->isErrors ())
				{
					try
					{
						//update dữ liệu
						$product_unit_change_code = $form->getValue ( "product_unit_change_code" );
						$product_unit_change_code = "," . implode ( ",", $product_unit_change_code ) . ",";
						$product->product_unit_change_code = $product_unit_change_code;
						$product->updateBase ( $id );						
						
						//cập nhật lại cách qui đổi đơn vị tính
						$this->updateChange($product->product_unit_change_code);
						
						//thông báo + chuyển hướng trang khi thành công				
						$this->_helper->flashMessenger ( 'Cập nhật thành công.' );
						if ($adminAction == 'apply')
						{
							$this->_helper->redirector ( 'update', 'index', 'product', array ('id' => $id ) );
						}
						else if ($adminAction == 'save-and-close')
						{
							$this->_helper->redirector ( 'index', 'index', 'product', array () );
						}
						else if ($adminAction == 'save-and-new')
						{
							$this->_helper->redirector ( 'insert', 'index', 'product', array () );
						}
					}
					catch ( Exception $e )
					{
						echo $e->getMessage ();
					}
				}
			}
		}
		else //khi vào form lần đầu tiên
		{
			$form->populate ( $first_product->toArray () );
			//$form->product_unit_change_code->setValue(explode(",", $first_product->product_unit_change_code));
		}
		
		//truyền dữ liệu ra view
		$this->view->form = $form;
	}
	
	public function updateChange($product_unit_change_code="")
	{
		$product_unit_change_code="'".str_replace(",", "','",$product_unit_change_code)."'";
		$unit_change=new Admin_Model_UnitChange();
		if($product_unit_change_code!="")
			$where="unit_change_code IN ($product_unit_change_code) AND unit_change_rate>0";
		$unit_changes=$unit_change->fetchAllBase($where);
		$change=new Admin_Model_Change();
		foreach ($unit_changes as $unit_change)
			$change->updateChange($unit_change->unit_change_code, $unit_change->unit_change_unit_code,$unit_change->unit_change_rate);
	}
}